<?php 
    //对象
?>

<?php 
    echo '创建类<br />';
    //创建classname类
    class classname {
        //创建属性
        public $attribute1;
        public $attribute2;

        //创建类的操作
        function operation1() {}
        function operation2( $paraml, $param2) {}

        //构造函数 - 创建对象前使用
        function _construct($param) 
        {
            echo "Constructor called with parameter - 使用参数调用构造函数 ".$param."<br />";
        }
    }

    //类的实例化 - 可供使用的对象
    $a = new classname("First");
    $b = new classname("Second");

    //使用类属性
    class classname2 {
    public $attribute;
    function operation ($param) 
    {
        $this->attribute = $param;
        echo $this->attribute;
        }
    }

    $a = new classname();
    $a->attribute = "简单的value.<br />";
    echo $a->attribute;

    //6.5调用类操作
    class classname3 {
    function operation1() {}
    function operation2( $paraml, $param2) {}
    }

    $a = new classname();
    $a->operation1();
    $a->operation2(12, "test");
    //若有返回值
    $x = $a->operation1();
    $y = $a->operation2(12, "test");


    //6.6使用修饰符
    class manners {
        private $greeting = 'Hello';
        public function greet ($name) 
        {
            echo "$this->greeting, $name";
        }

    }


    //6.7编写访问器函数
    class classname5 {
        private $attribute;

        //返回attribute属性值
        function _get($name) 
        {
            return $this->$name;
        }

        //给attribute属性赋值
        //属性名称，要赋予的值
        function _set ($name, $value)
        {
            $this->$name = $value;
        }
        }

        //实例化一个类
        $a = new classname();
        //隐式调用_set函数，$name的参数值杯设为"attribute",$value被设为5
        $a->attribute = 5;

        //隐式调用_get函数，$name的参数值杯设为"attribute"
        $a->attribute;
        //通过唯一访问入口，修改函数内部实现
        function _set($name, $value)
        {
            if (($name=="attribute") && ($value >= 0) && ($value <= 100)) {
                $this->attribute = $value;
            }
        }

        //6.8在PHP中实现继承
        //指定类B继承类A
        class A 
        {

        }

        class B extends A 
        {
            public $attribute2;
            function operation2()
            {}
        }

        //6.8.1 - 通过继承使用private和protected控制可见性
        //6.8.2 - 覆盖
        class Ad
        {
            public $attribute = 'default value';
            function operation()
            {
                echo 'Something<br />';
                echo 'The value of $sttribute is'.$this->attribute.'<br />';
            }
        }

        class Bd extends Ad
        {
            public $attribute = 'different value';
            function operation()
            {
                echo 'Something else<br />';
                echo 'The value of $sttribute is'.$this->attribute.'<br />';
            }
        }

        //6.8.5 - 实现接口
        interface Displayable
        {
            function display();
        }
        class webPage implements Displayable
        {
            function display()
            {
                //……
            }
        }

        //6.9 - 使用Trait
        trait logger
        {
            public function logmessage($message, $level='DEBUG')
            {
                //write $message to a log
            }
        }

        //使用trait
        class fileStorages
        {
            use logger;
            function store($data) {
                //...
                $this->logmessage($msg);
            }
        }


        //组合多个Trait，显式指定需要使用特定Trait的功能
        trait fileLogger
        {
            public function logmessage($message, $level='DEBUG')
            {
                //write $message to a file
            }
        }

        trait sysLogger
        {
            public function logmessage($message, $level='ERROR')
            {
                //write $message to a file
            }
        }

        class fileStorage
        {
            use fileLogger, sysLogger
            {
                fileLogger::logmessage insteadof sysLogger;
                sysLogger::logmessage as private logsysmessage;
            }

            function store($data)
            {
                //...
                $this->logmessage($message);
                $this->logsysmessage($message);
            }
        }

        //6.12.1 - 使用类级别常量
        class MathS
        {
            const pi = 3.14159;
        }
        echo "Math::pi=".MathS::pi."<br />";

        //6.12.2 - 实现静态方法，在未初始化类的情况下调用方法
        class Math
        {
            static function squared($input)
            {
                return $input*$input;
            }
        }
        echo Math::squared(8);
        echo "<br />";

        //6.12.3 - 检查类类型和类型提示
        //{$b instanceof B}

        //6.12.4 - 延迟静态绑定
        class ABS {
            public static function whichclass(){
                echo "_CLASS_";
            }
            public static function test() {
                self::whichclass();
            }
        }

        class BBS extends ABS {
            public static function whichclass() {
                echo "11";
            }
        }
        ABS::test();
        echo "<br />";
        BBS::test();

        //6.12.5 - 对象克隆
        $c = clone $b;
        //6.12.6 - 使用抽象类
        //abstract operationX($paraml, $param2);

        abstract class overload {
        abstract function prerationX($paraml, $param2);
    }
        //6.12.7 - 使用_call重载方法
        #public
         function _call($method, $p)
        {
            if ($method == "display") {
                if (is_object($p[0])) {
                    $this->displayObjiect($p[0]);
                } 
                if (is_array($p[0])) {
                    $this->displayArray($p[0]);
                }
                $this->displayScalar($p[0]);
            }
        }
        //先实例化包含_call()方法的类，再调用display()
        #$ov = new overload;
        #$ov->display(array(1, 2, 3));
        #$ov->display('cat');

        //通过静态上下文调用一个不可访问的方法时，_callStatic()才会被调用
        #overload::display();

        //6.12.8 使用_autoload()方法
        function _autoload($name)
        {
            //引入一个具有该类相同名称的文件
            include_once $name.".php";
        }

        //6.12.9 实现迭代器和迭代
        class myClass
        {
            public $a = "5";
            public $b = "7";
            public $c = "9";
        }
        $x = new myClass;
        foreach($x as $attribute) {
            echo "<br />".$attribute;
        }
?>